import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.args.ListPosition;

import javax.swing.*;
import java.util.List;

public class RedisList1 {

    public static void test1(Jedis jedis) {
        System.out.println("lpush 和 lrange");
        // 先进行清空Redis中的数据
        jedis.flushAll();

        jedis.lpush("key1", "111","222","333"); // 从左侧也就是头结点进行插入，先插入的如果是从左侧出，那就是最后出

        List<String> key1 = jedis.lrange("key1", 0, -1);// 查看区间内的于元素
        System.out.println("key1: " + key1);
    }

    public static void test2(Jedis jedis) {
        System.out.println("lpushx 和 rpush 和 rpushx");
        jedis.flushAll();

        // 这个和 lpush是相似的，当key存在时候和lpush效果一致，但是当key不存在的时候，就会返回0
        jedis.lpushx("key1", "111","222","333");

        // 相当于是尾插操作，这样之后111就是在头节点的位置上
        jedis.rpush("key2", "111","222","333");

        // 这个的效果和lpushx相似，只是这个是尾插而已
        jedis.rpushx("key2", "444","555","666");

    }

    public static void test3(Jedis jedis) {
        System.out.println("lpop 和 rpop");
        jedis.flushAll();

        jedis.lpush("key1", "111","222","333");

        String key1 = jedis.rpop("key1"); // 进行尾删操作得到的是 111

        jedis.rpush("key2", "111","222","333");

        String key2 = jedis.lpop("key2"); // 进行头删操作得到的是 111

        System.out.println(key1);
        System.out.println(key2);
    }

    public static void test4(Jedis jedis) {
        System.out.println("lindex 和 linset 和 llen");
        jedis.flushAll();

        jedis.lpush("key1", "111","222","333");

        // 获取从左侧数 第index位置的元素
        String result1 = jedis.lindex("key1", 2);

        // 在key中的pivot元素之前(ListPosition.BEFORE)或之后(ListPosition.AFTER) 位置插入 value 元素
        jedis.linsert("key1", ListPosition.BEFORE, "222", "888");

        List<String> result2 = jedis.lrange("key1", 0, -1);

        System.out.println(result2);

        // 获取key这个对应value的长度
        long len = jedis.llen("key1");

        System.out.println(len);
    }

    public static void test5(Jedis jedis) {
        System.out.println("lrem");
        jedis.flushAll();

        jedis.lpush("key1", "111","222","333","222");

        // 这个是删除 count 个 value 元素从key中
        // 当court > 0 时，从左往右进行删除 count 个 value 元素
        // 当court < 0 时，从右往左进行删除 count 个 value 元素
        // 当court = 0 时，删除所有的 value 元素从 key中
        jedis.lrem("key1", 1, "222");

        List<String> result = jedis.lrange("key1", 0, -1);

        System.out.println(result);
    }

    public static void test6(Jedis jedis) {
        System.out.println("ltrim 和 lset");
        jedis.flushAll();

        jedis.lpush("key1", "111","222","333","444","555","666","777");

        // 删除 start 和 stop 区间外的所有元素
        jedis.ltrim("key1", 2, 4);

        List<String> result1 = jedis.lrange("key1", 0, -1);

        System.out.println(result1);

        jedis.lpush("key2", "111","222","333","444","555","666","777");

        // 根据下标 index 位置 进行修改 元素为 value
        jedis.lset("key2", 2, "8888");

        List<String> result2 = jedis.lrange("key2", 0, -1);

        System.out.println(result2);
    }

    public static void main(String[] args) {
        // 连接到Redis 服务器中
        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");

        try (Jedis jedis = jedisPool.getResource()) {
//            test1(jedis);
//            test2(jedis);
//            test3(jedis);
//            test4(jedis);
//            test5(jedis);
            test6(jedis);
        }
    }
}
